package main

import "fmt"

func main() {
	// 定义字符串： 字符串是字节的定长数组
	// 可以使用双引号 "" 来定义字符串，字符串中可以使用转义字符来实现换行、缩进等效果，常用的转义字符包括：
	// \n：换行符
	// \r：回车符
	// \t：tab 键
	// \u 或 \U：Unicode 字符
	// \\：反斜杠自身
	var str = "Go语言教程\nGo语言教程"
	fmt.Println(str)
	fmt.Println(len(str)) // 计算字符串的字节数

	// 使用反引号 `` 来定义原生字符串，原生字符串可以包含多行内容，并且其中的转义字符不会被解析
	var rawStr = `Go语言教程Go语言教程`
	fmt.Println(rawStr)
	fmt.Println(len(rawStr)) // 计算字符串的字节数

	// 字符串是不可变的
	s := "hello"
	// s[0] = 'H' // 编译错误，字符串是不可变的
	fmt.Println(s)

	// 可以通过切片操作获取字符串的子串
	subStr := s[1:4]
	fmt.Println(subStr)

	// 可以使用 + 操作符来连接字符串
	s2 := s + " world"
	fmt.Println(s2)

	// 可以使用 fmt.Sprintf 函数来格式化字符串
	name := "张三"
	age := 30
	s3 := fmt.Sprintf("姓名：%s，年龄：%d", name, age)
	fmt.Println(s3)

	sql := `
SELECT id, name
FROM users
WHERE age > %d
  AND status = '%s';`
	fmt.Println(fmt.Sprintf(sql, 18, "active"))

	// 使用 range 循环遍历字符串中的每个字符
	longStr := "Hello, World!"
	for i, ch := range longStr {
		fmt.Printf("Index: %d, Character: %c\n", i, ch)
	}
}
